#include <stdio.h>
#include "server.h"

// 信号处理（优雅关闭）
volatile sig_atomic_t shutdown_flag = 0;
atomic_int active_connections = 0;

// 信号处理函数
void signal_handler(int sig) {
    printf("收到退出信号，开始清理资源...\n");
    shutdown_flag = 1;
    // 清空任务队列
    thread_pool_clear();
    // 唤醒所有工作线程
    for (int i = 0; i < THREAD_POOL_SIZE; i++) {
        sem_post(&pool.task_count);
        pthread_kill(worker_tids[i], SIGUSR1);
    }
}

int main() {
    signal(SIGINT, signal_handler);  // 捕获 Ctrl+C
    signal(SIGUSR1, SIG_IGN); // 忽略 SIGUSR1 信号

    // 初始化线程池
    thread_pool_init();

    // 创建工作线程
    for (int i = 0; i < THREAD_POOL_SIZE; i++) {
        pthread_create(&worker_tids[i], NULL, worker_thread, NULL);
        pthread_detach(worker_tids[i]);
    }

    // 创建服务端套接字
    int server_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (server_fd < 0) {
        perror("套接字创建失败");
        exit(EXIT_FAILURE);
    }

    // 设置地址重用
    int opt = 1;
    setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

    // 绑定地址
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = INADDR_ANY;
    addr.sin_port = htons(PORT);
    if (bind(server_fd, (const struct sockaddr *)&addr, sizeof(addr)) < 0) {
        perror("绑定失败");
        exit(EXIT_FAILURE);
    }

    // 开始监听
    if (listen(server_fd, 100) < 0) {
        perror("监听失败");
        exit(EXIT_FAILURE);
    }

    // 设置为非阻塞模式
    int flags = fcntl(server_fd, F_GETFL, 0);
    fcntl(server_fd, F_SETFL, flags | O_NONBLOCK);

    printf("服务端运行在 :%d\n", PORT);

    // 主循环接受连接
    while (!shutdown_flag) {
        struct sockaddr_in client_addr;
        socklen_t client_len = sizeof(client_addr);
        int client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_len);
        if (client_fd < 0) {
            if (shutdown_flag) break;  // 优雅退出
            if (errno == EAGAIN || errno == EWOULDBLOCK) {
                usleep(100000); // 短暂休眠
                continue;
            }
            perror("接受连接失败");
            continue;
        }

        // 打印客户端IP
        char client_ip[INET_ADDRSTRLEN];
        inet_ntop(AF_INET, &client_addr.sin_addr, client_ip, sizeof(client_ip));
        printf("新客户端连接: %s\n", client_ip);

        // 添加任务到线程池
        thread_pool_add_task(client_fd);
    }

    // 等待所有工作线程退出
    sleep(1);

    // 清理资源
    close(server_fd);
    pthread_mutex_destroy(&pool.lock);
    sem_destroy(&pool.task_count);
    printf("服务端已关闭\n");
    return 0;
}